package com.hanserwei.han_picture.manager.auth;

import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.hanserwei.han_picture.domain.entity.po.Space;
import com.hanserwei.han_picture.domain.entity.po.SpaceUser;
import com.hanserwei.han_picture.domain.entity.po.User;
import com.hanserwei.han_picture.enums.SpaceTypeEnum;
import com.hanserwei.han_picture.enums.SpaceUserRoleEnum;
import com.hanserwei.han_picture.manager.auth.model.SpaceUserAuthConfig;
import com.hanserwei.han_picture.manager.auth.model.SpaceUserRole;
import com.hanserwei.han_picture.service.SpaceUserService;
import com.hanserwei.han_picture.service.UserService;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;

/**
 * 空间成员权限管理
 */
@Component
public class SpaceUserAuthManager {

    private static final SpaceUserAuthConfig SPACE_USER_AUTH_CONFIG;

    static {
        // 读取配置文件
        String json = ResourceUtil.readUtf8Str("biz/spaceUserAuthConfig.json");
        // 转换为对象
        SPACE_USER_AUTH_CONFIG = JSONUtil.toBean(json, SpaceUserAuthConfig.class);
    }

    private final UserService userService;
    private final SpaceUserService spaceUserService;

    public SpaceUserAuthManager(UserService userService, SpaceUserService spaceUserService) {
        this.userService = userService;
        this.spaceUserService = spaceUserService;
    }

    /**
     * 根据角色获取权限
     *
     * @param spaceUserRole viewer/editor/admin
     * @return 权限列表
     */
    public List<String> getPermissionsByRole(String spaceUserRole) {
        if (StrUtil.isBlank(spaceUserRole)) {
            return Collections.emptyList();
        }
        // 获取角色对应的权限
        SpaceUserRole role = SPACE_USER_AUTH_CONFIG.getRoles().stream()
                .filter(userRole -> userRole.getKey().equals(spaceUserRole))
                .findFirst()
                .orElse(null);
        return role == null ? Collections.emptyList() : role.getPermissions();
    }

    /**
     * 获取权限列表
     *
     * @param space     空间
     * @param loginUser 登录用户
     * @return 权限列表
     */
    public List<String> getPermissionList(Space space, User loginUser) {
        // 未登录, 无权限
        if (loginUser == null) {
            return Collections.emptyList();
        }
        // 获取管理员权限
        List<String> ADMIN_PERMISSIONS = this.getPermissionsByRole(SpaceUserRoleEnum.ADMIN.getValue());
        if (space == null) {
            // 公共图库, 管理员有权限操作
            if (userService.isAdmin(loginUser)) {
                return ADMIN_PERMISSIONS;
            }
            return Collections.emptyList();
        }
        SpaceTypeEnum spaceTypeEnum = SpaceTypeEnum.getEnumByValue(space.getSpaceType());
        if (spaceTypeEnum == null) {
            return Collections.emptyList();
        }
        // 根据空间类型获取对应权限
        switch (spaceTypeEnum) {
            case PRIVATE:
                // 私有空间, 仅本人或管理员有权限
                if (loginUser.getId().equals(space.getUserId()) || userService.isAdmin(loginUser)) {
                    return ADMIN_PERMISSIONS;
                } else {
                    return Collections.emptyList();
                }
            case TEAM:
                // 团队空间, 获取角色和权限
                SpaceUser spaceUser = spaceUserService.lambdaQuery()
                        .eq(SpaceUser::getSpaceId, space.getId())
                        .eq(SpaceUser::getUserId, loginUser.getId())
                        .one();
                if (spaceUser == null) {
                    return Collections.emptyList();
                } else {
                    // 返回空间用户角色对应的权限
                    return this.getPermissionsByRole(spaceUser.getSpaceRole());
                }
        }
        return Collections.emptyList();
    }
}